跳到主要内容

07 EXTI中断实验

up的视频讲解

把反复读取按键改为响应外部边沿,观察中断怎样影响主循环里的流水灯。

例程代码: 📥按键控制流水灯实验代码

🔤中断服务函数

HAL 库为了用户使用方便,提供了一个中断通用入口函数 HAL_GPIO_EXTI_IRQHandler

  • 在该函数内部直接调用中断回调函数 HAL_GPIO_EXTI_Callback()

  • 用户只要在中断回调函数中写程序即可

1 🔽按键控制流水灯实验​

1.1 实验连接​

按图连接按键与 LED。按键信号接 PA0,通过 EXTI0 产生外部中断。

按图连接按键与 LED。按键信号接 PA0,通过 EXTI0 产生外部中断。
按图连接按键与 LED。按键信号接 PA0,通过 EXTI0 产生外部中断。

1.2 实验原理​

流水灯中的延时会让轮询不能随时检查按键。中断把“事件来了”的通知交给硬件,主循环可以继续按自己的流程运行。

对比持续轮询与由事件发起通知两种处理方式。
对比持续轮询与由事件发起通知两种处理方式。

按键松开时,由下拉确定低电平;按下时产生上升沿。这个变化经过 EXTI 边沿检测和中断控制,再送到 NVIC。

按键边沿 → EXTI 请求 → NVIC → 中断处理,依次对应前两课的模块。
按键边沿 → EXTI 请求 → NVIC → 中断处理,依次对应前两课的模块。

HAL 的中断入口调用 HAL_GPIO_EXTI_Callback()。本课代码在回调中把 flag 设为 1,主循环再根据它选择流水灯分支。阅读时要把“处理通知”和“运行灯效”分开。

1.3 CubeMX配置​

PA0选择GPIO_EXTI0,上升沿触发,Pull-down。NVIC打开EXTI line0中断;LED引脚保持上一节的推挽输出配置。

CubeMX配置
CubeMX配置
CubeMX配置
CubeMX配置

1.4 实验代码​

全局​

uint8_t flag = 0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
flag = 1;
}

main()​

while(1)里面​

if(flag == 1)
{
//流水灯1
}
else
{
//流水灯2
}

2 ☀️光照/温度控制流水灯实验​

2.1 实验连接​

把传感器数字输出接到原先的按键输入位置,保持供电与共地。

把传感器数字输出接到原先的按键输入位置,保持供电与共地。
把传感器数字输出接到原先的按键输入位置,保持供电与共地。

2.2 实验原理​

传感器超过阈值后,DO 发生电平变化。对 EXTI 来说,它与按键一样都是一个外部边沿来源。

要先看模块在触发时输出高还是低,再选择上升沿或下降沿;不能只因为沿用接线,就假设触发方向也完全相同。

2.3 CubeMX配置​

传感器DO接PA0,若模块DO为低有效,EXTI0改为下降沿触发;已有外部上拉时使用No Pull。若需要同时响应明暗两种变化,选择双边沿,并在回调/主循环读取当前电平决定动作。NVIC仍需使能EXTI0。

2.4 实验代码​

我们直接复用按键控制的代码